package partThree;
import java.io.*;
import java.util.Scanner;

/*本类用于练习文件复制综合案例*/
public class TestCopyFile {
    public static void main(String[] args) {
        //1.提示并接收用户输入的源文件路径和目标位置
        System.out.println("请您输入源文件路径：");
        String f = new Scanner(System.in).nextLine();
        System.out.println("请您输入目标位置：");
        String t = new Scanner(System.in).nextLine();
        //2.调用方法完成文件的复制
        //ZFCopy(f,t);//用字符流完成复制案例
        ZJCopy(f,t);//用字节流完成复制案例
    }
    private static void ZJCopy(String f,String t) {
        //1.定义在整个方法中都生效的局部变量，手动初始化值为null
        InputStream in = null;
        OutputStream out = null;
        //2.由于代码可能会发生异常，所以需要try-catch-finally结构
        try{
            //3.1创建高效/缓冲字节输入流，参数是f
            in = new BufferedInputStream(new FileInputStream(f));
            //3.2创建高效/缓冲字节输出流，参数是t
            out = new BufferedOutputStream(new FileOutputStream(t));

            //4.创建好流对象以后就可以通过流对象完成业务了
            //4.1定义变量保存读到的数据
            int b;
            //4.2使用循环完成复制操作
            while((b=in.read())!=-1){
                out.write(b);
            }
            System.out.println("恭喜您~文件复制成功~");
        }catch(Exception e){
            System.out.println("很抱歉~文件复制失败~");
            e.printStackTrace();
        }finally {
            //5.关流
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    private static void ZFCopy(String f,String t) {
        //1.定义在整个方法中都生效的局部变量，手动初始化值为null
        Reader in = null;
        Writer out = null;
        //2.由于代码可能会发生异常，所以需要try-catch-finally结构
        try{
            //3.1创建高效/缓冲字符输入流,传入的参数是源文件的路径
            in = new BufferedReader(new FileReader(f));
            //3.2创建高效/缓冲字符输出流，传入的参数是目标文件的路径
            out = new BufferedWriter(new FileWriter(t));

            //4.拿到流对象以后，就可以使用流对象来完成业务了
            //4.1定义变量用来记录读到的数据
            int b;
            //4.2循环读取目标文件，直到返回值为-1，没有数据时结束循环
            while((b=in.read())!=-1){
                out.write(b);/*将本次循环从源文件读到的内容写出到目标文件中*/
            }
            System.out.println("恭喜您！文件复制成功！");
        }catch (Exception e){
            System.out.println("很抱歉！文件复制失败！");
            e.printStackTrace();
        }finally {
            /*关流是有顺序的：如果有多个流，最后创建的流最先关闭
             * 多条关流语句需要各自try-catch*/
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}